"""
Support for Lagute LW-12 WiFi LED Controller.

For more details about this platform, please refer to the documentation at
https://home-assistant.io/components/light.lw12wifi/
"""

import logging

import voluptuous as vol

from homeassistant.components.light import (
    ATTR_BRIGHTNESS, ATTR_EFFECT, ATTR_HS_COLOR, ATTR_TRANSITION,
    Light, PLATFORM_SCHEMA, SUPPORT_BRIGHTNESS, SUPPORT_EFFECT,
    SUPPORT_COLOR, SUPPORT_TRANSITION
)
from homeassistant.const import (
    CONF_HOST, CONF_NAME, CONF_PORT
)
import homeassistant.helpers.config_validation as cv
import homeassistant.util.color as color_util


REQUIREMENTS = ['lw12==0.9.2']

_LOGGER = logging.getLogger(__name__)


DEFAULT_NAME = 'LW-12 FC'
DEFAULT_PORT = 5000

PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
    vol.Required(CONF_HOST): cv.string,
    vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port,
    vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string,
})


def setup_platform(hass, config, add_entities, discovery_info=None):
    """Set up LW-12 WiFi LED Controller platform."""
    import lw12

    # Assign configuration variables.
    name = config.get(CONF_NAME)
    host = config.get(CONF_HOST)
    port = config.get(CONF_PORT)
    # Add devices
    lw12_light = lw12.LW12Controller(host, port)
    add_entities([LW12WiFi(name, lw12_light)])


class LW12WiFi(Light):
    """LW-12 WiFi LED Controller."""

    def __init__(self, name, lw12_light):
        """Initialise LW-12 WiFi LED Controller.

        Args:
            name: Friendly name for this platform to use.
            lw12_light: Instance of the LW12 controller.
        """
        self._light = lw12_light
        self._name = name
        self._state = None
        self._effect = None
        self._rgb_color = [255, 255, 255]
        self._brightness = 255
        # Setup feature list
        self._supported_features = SUPPORT_BRIGHTNESS | SUPPORT_EFFECT \
            | SUPPORT_COLOR | SUPPORT_TRANSITION

    @property
    def name(self):
        """Return the display name of the controlled light."""
        return self._name

    @property
    def brightness(self):
        """Return the brightness of the light."""
        return self._brightness

    @property
    def hs_color(self):
        """Read back the hue-saturation of the light."""
        return color_util.color_RGB_to_hs(*self._rgb_color)

    @property
    def effect(self):
        """Return current light effect."""
        if self._effect is None:
            return None
        return self._effect.replace('_', ' ').title()

    @property
    def is_on(self):
        """Return true if light is on."""
        return self._state

    @property
    def supported_features(self):
        """Return a list of supported features."""
        return self._supported_features

    @property
    def effect_list(self):
        """Return a list of available effects.

        Use the Enum element name for display.
        """
        import lw12
        return [effect.name.replace('_', ' ').title()
                for effect in lw12.LW12_EFFECT]

    @property
    def assumed_state(self) -> bool:
        """Return True if unable to access real state of the entity."""
        return True

    @property
    def shoud_poll(self) -> bool:
        """Return False to not poll the state of this entity."""
        return False

    def turn_on(self, **kwargs):
        """Instruct the light to turn on."""
        import lw12
        self._light.light_on()
        if ATTR_HS_COLOR in kwargs:
            self._rgb_color = color_util.color_hs_to_RGB(
                *kwargs[ATTR_HS_COLOR])
            self._light.set_color(*self._rgb_color)
            self._effect = None
        if ATTR_BRIGHTNESS in kwargs:
            self._brightness = kwargs.get(ATTR_BRIGHTNESS)
            brightness = int(self._brightness / 255 * 100)
            self._light.set_light_option(lw12.LW12_LIGHT.BRIGHTNESS,
                                         brightness)
        if ATTR_EFFECT in kwargs:
            self._effect = kwargs[ATTR_EFFECT].replace(' ', '_').upper()
            # Check if a known and supported effect was selected.
            if self._effect in [eff.name for eff in lw12.LW12_EFFECT]:
                # Selected effect is supported and will be applied.
                self._light.set_effect(lw12.LW12_EFFECT[self._effect])
            else:
                # Unknown effect was set, recover by disabling the effect
                # mode and log an error.
                _LOGGER.error("Unknown effect selected: %s", self._effect)
                self._effect = None
        if ATTR_TRANSITION in kwargs:
            transition_speed = int(kwargs[ATTR_TRANSITION])
            self._light.set_light_option(lw12.LW12_LIGHT.FLASH,
                                         transition_speed)
        self._state = True

    def turn_off(self, **kwargs):
        """Instruct the light to turn off."""
        self._light.light_off()
        self._state = False
